From: Jeroen van der Heijden Date: Thu, 21 Jan 2021 21:36:18 +0000 (+0100) Subject: Fixed more refcount X-Git-Tag: archive/raspbian/2.0.44-1+rpi1~1^2~3^2^2~3^2~3 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=32607608ac2920096cd7175021a063c6d91165a7;p=siridb-server.git Fixed more refcount --- diff --git a/include/siri/db/db.h b/include/siri/db/db.h index be216938..20fb8fad 100644 --- a/include/siri/db/db.h +++ b/include/siri/db/db.h @@ -55,8 +55,9 @@ void siridb__free(siridb_t * siridb); void siridb_drop(siridb_t * siridb); void siridb_update_shard_expiration(siridb_t * siridb); -#define siridb_incref(siridb) siridb->ref++ -#define siridb_decref(_siridb) if (!--_siridb->ref) siridb__free(_siridb) +#define siridb_incref(siridb__) __atomic_add_fetch(&(siridb__)->ref, 1, __ATOMIC_SEQ_CST) +#define siridb_decref(siridb__) \ + if (!__atomic_sub_fetch(&(siridb__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__free(siridb__) #define siridb_is_reindexing(siridb) (siridb->flags & SIRIDB_FLAG_REINDEXING) struct siridb_s diff --git a/include/siri/db/group.h b/include/siri/db/group.h index d1d38606..2eb33d51 100644 --- a/include/siri/db/group.h +++ b/include/siri/db/group.h @@ -42,9 +42,9 @@ int siridb_group_is_remote_prop(uint32_t prop); void siridb__group_decref(siridb_group_t * group); void siridb__group_free(siridb_group_t * group); -#define siridb_group_incref(group__) (group__)->ref++ +#define siridb_group_incref(group__) __atomic_add_fetch(&(group__)->ref, 1, __ATOMIC_SEQ_CST) #define siridb_group_decref(group__) \ - if (!--(group__)->ref) siridb__group_free(group__) + if (!__atomic_sub_fetch(&(group__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__group_free(group__) struct siridb_group_s { diff --git a/include/siri/db/groups.h b/include/siri/db/groups.h index 900cdd3b..5ff1d18d 100644 --- a/include/siri/db/groups.h +++ b/include/siri/db/groups.h @@ -65,6 +65,7 @@ int siridb_groups_add_group( int siridb_groups_add_series( siridb_groups_t * groups, siridb_series_t * series); +void siridb__groups_free(siridb_groups_t * groups); struct siridb_groups_s { @@ -78,4 +79,10 @@ struct siridb_groups_s uv_mutex_t mutex; uv_thread_t thread; }; + +#define siridb_groups_incref(groups__) __atomic_add_fetch(&(groups__)->ref, 1, __ATOMIC_SEQ_CST) +#define siridb_groups_decref(groups__) \ + if (!__atomic_sub_fetch(&(groups__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__groups_free(groups__) + + #endif /* SIRIDB_GROUPS_H_ */ diff --git a/include/siri/db/series.h b/include/siri/db/series.h index 0e051aa8..05b1f3a4 100644 --- a/include/siri/db/series.h +++ b/include/siri/db/series.h @@ -128,15 +128,14 @@ void siridb_series_ensure_type(siridb_series_t * series, qp_obj_t * qp_obj); /* * Increment the series reference counter. */ -#define siridb_series_incref(series) series->ref++ - +#define siridb_series_incref(series__) __atomic_add_fetch(&(series__)->ref, 1, __ATOMIC_SEQ_CST) /* + * * Decrement reference counter for series and free the series when zero is * reached. */ #define siridb_series_decref(series__) \ - if (!--series__->ref) siridb__series_free(series__) - + if (!__atomic_sub_fetch(&(series__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__series_free(series__) #define siridb_series_server_id(series) \ ((series->flags & SIRIDB_SERIES_IS_SERVER_ONE) == SIRIDB_SERIES_IS_SERVER_ONE) diff --git a/include/siri/db/server.h b/include/siri/db/server.h index 2b74cd12..ae188b8d 100644 --- a/include/siri/db/server.h +++ b/include/siri/db/server.h @@ -130,7 +130,7 @@ void siridb__server_free(siridb_server_t * server); #define siridb_server_update_flags(org, new) \ org = new | (org & (SERVER_FLAG_AUTHENTICATED | SERVER_FLAG_QUEUE_FULL)) -#define siridb_server_incref(server) server->ref++ +#define siridb_server_incref(server__) __atomic_add_fetch(&(server__)->ref, 1, __ATOMIC_SEQ_CST) /* * Decrement server reference counter and free the server when zero is reached. @@ -138,7 +138,7 @@ void siridb__server_free(siridb_server_t * server); * and each promise->cb() will be called. */ #define siridb_server_decref(server__) \ - if (!--server__->ref) siridb__server_free(server__) + if (!__atomic_sub_fetch(&(server__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__server_free(server__) struct siridb_server_s { diff --git a/include/siri/db/shard.h b/include/siri/db/shard.h index 969ef74d..759af922 100644 --- a/include/siri/db/shard.h +++ b/include/siri/db/shard.h @@ -162,7 +162,7 @@ static inline siridb_shard_get_points_cb siridb_shard_get_points_callback( /* * Increment the shard reference counter. */ -#define siridb_shard_incref(shard) shard->ref++ +#define siridb_shard_incref(shard__) __atomic_add_fetch(&(shard__)->ref, 1, __ATOMIC_SEQ_CST) /* * Decrement the reference counter, when 0 the shard will be destroyed. @@ -173,7 +173,7 @@ static inline siridb_shard_get_points_cb siridb_shard_get_points_callback( * A signal can be raised in case closing the shard file fails. */ #define siridb_shard_decref(shard__) \ - if (!--shard__->ref) siridb__shard_free(shard__) + if (!__atomic_sub_fetch(&(shard__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__shard_free(shard__) #define siridb_shard_idx_file(Name__, Fn__) \ diff --git a/include/siri/db/tag.h b/include/siri/db/tag.h index a5f340d2..3e8823f9 100644 --- a/include/siri/db/tag.h +++ b/include/siri/db/tag.h @@ -33,9 +33,9 @@ int siridb_tag_set_name( const char * name, char * err_msg); -#define siridb_tag_incref(tag__) (tag__)->ref++ +#define siridb_tag_incref(tag__) __atomic_add_fetch(&(tag__)->ref, 1, __ATOMIC_SEQ_CST) #define siridb_tag_decref(tag__) \ - if (!--(tag__)->ref) siridb__tag_free(tag__) + if (!__atomic_sub_fetch(&(tag__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__tag_free(tag__) struct siridb_tag_s { diff --git a/include/siri/db/tags.h b/include/siri/db/tags.h index 9a24c6c6..f8a40a06 100644 --- a/include/siri/db/tags.h +++ b/include/siri/db/tags.h @@ -33,8 +33,6 @@ struct siridb_tags_s }; int siridb_tags_init(siridb_t * siridb); -void siridb_tags_incref(siridb_tags_t * tags); -void siridb_tags_decref(siridb_tags_t * tags); int siridb_tags_drop_tag( siridb_tags_t * tags, const char * name, @@ -50,7 +48,7 @@ void siridb_tags_init_nseries(siridb_tags_t * tags); sirinet_pkg_t * siridb_tags_pkg(siridb_tags_t * tags, uint16_t pid); sirinet_pkg_t * siridb_tags_series(siridb_series_t * series); sirinet_pkg_t * siridb_tags_empty(siridb_tags_t * tags); - +void siridb__tags_free(siridb_tags_t * tags); #define siridb_tags_set_require_save(__tags, __tag) \ do{ \ @@ -58,4 +56,9 @@ do{ \ (__tag)->flags |= TAG_FLAG_REQUIRE_SAVE; \ }while(0) + +#define siridb_tags_incref(tags__) __atomic_add_fetch(&(tags__)->ref, 1, __ATOMIC_SEQ_CST) +#define siridb_tags_decref(tags__) \ + if (!__atomic_sub_fetch(&(tags__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__tags_free(tags__) + #endif /* SIRIDB_TAGS_H_ */ diff --git a/include/siri/db/user.h b/include/siri/db/user.h index d333d732..a9ffed3f 100644 --- a/include/siri/db/user.h +++ b/include/siri/db/user.h @@ -36,13 +36,13 @@ int siridb_user_cexpr_cb(siridb_user_t * user, cexpr_condition_t * cond); /* * Increment the user reference counter. */ -#define siridb_user_incref(user) user->ref++ +#define siridb_user_incref(user__) __atomic_add_fetch(&(user__)->ref, 1, __ATOMIC_SEQ_CST) /* * Decrement user reference counter and free the user when zero is reached. */ #define siridb_user_decref(user__) \ - if (!--user__->ref) siridb__user_free(user__) + if (!__atomic_sub_fetch(&(user__)->ref, 1, __ATOMIC_SEQ_CST)) siridb__user_free(user__) struct siridb_user_s { diff --git a/include/siri/net/promise.h b/include/siri/net/promise.h index 85273e27..d66ff734 100644 --- a/include/siri/net/promise.h +++ b/include/siri/net/promise.h @@ -27,7 +27,6 @@ typedef void (* sirinet_promise_cb)( #include - const char * sirinet_promise_strstatus(sirinet_promise_status_t status); #define sirinet_promise_incref(p__) (p__)->ref++ diff --git a/include/siri/net/stream.h b/include/siri/net/stream.h index 16c79b3f..b07065f4 100644 --- a/include/siri/net/stream.h +++ b/include/siri/net/stream.h @@ -36,12 +36,12 @@ void sirinet_stream_on_data( const uv_buf_t * buf); void sirinet__stream_free(uv_stream_t * uvclient); -#define sirinet_stream_incref(client) \ - (client)->ref++ +#define sirinet_stream_incref(client__) \ + __atomic_add_fetch(&(client__)->ref, 1, __ATOMIC_SEQ_CST) -#define sirinet_stream_decref(client) \ - if (!--(client)->ref) uv_close( \ - (uv_handle_t *) (client)->stream, \ +#define sirinet_stream_decref(client__) \ + if (!__atomic_sub_fetch(&(client__)->ref, 1, __ATOMIC_SEQ_CST)) uv_close( \ + (uv_handle_t *) (client__)->stream, \ (uv_close_cb) sirinet__stream_free) struct sirinet_stream_s diff --git a/include/siri/version.h b/include/siri/version.h index 15a908e9..0e27752f 100644 --- a/include/siri/version.h +++ b/include/siri/version.h @@ -15,7 +15,7 @@ * Note that debian alpha packages should use versions like this: * 2.0.34-0alpha0 */ -#define SIRIDB_VERSION_PRE_RELEASE "-alpha-1" +#define SIRIDB_VERSION_PRE_RELEASE "-alpha-2" #ifndef NDEBUG #define SIRIDB_VERSION_BUILD_RELEASE "+debug" diff --git a/include/vec/vec.h b/include/vec/vec.h index 31b769a5..b2cd1e28 100644 --- a/include/vec/vec.h +++ b/include/vec/vec.h @@ -24,7 +24,7 @@ int vec_append_safe(vec_t ** vec, void * data); * Expects the object to have a object->ref (uint_xxx_t) on top of the * objects definition. */ -#define vec_object_incref(object) ((vec_object_t * ) object)->ref++ +#define vec_object_incref(object__) __atomic_add_fetch(&((vec_object_t * ) object__)->ref, 1, __ATOMIC_SEQ_CST) /* * Expects the object to have a object->ref (uint_xxx_t) on top of the @@ -34,7 +34,7 @@ int vec_append_safe(vec_t ** vec, void * data); * there are still references left on the object since an object * probably needs specific cleanup tasks. */ -#define vec_object_decref(object) ((vec_object_t * ) object)->ref-- +#define vec_object_decref(object__) __atomic_sub_fetch(&((vec_object_t * ) object__)->ref, 1, __ATOMIC_SEQ_CST) /* * Append data to the list. This functions assumes the list can hold the new diff --git a/src/siri/backup.c b/src/siri/backup.c index 217f4ee7..5b8a91da 100644 --- a/src/siri/backup.c +++ b/src/siri/backup.c @@ -228,7 +228,7 @@ static int BACKUP_walk(siridb_t * siridb, void * args __attribute__((unused))) { siri_fp_close(shard->replacing->fp); } - --shard->ref; /* at least two references exist */ + siridb_shard_decref(shard); } vec_free(shard_list); diff --git a/src/siri/db/group.c b/src/siri/db/group.c index 45b370d6..885d7fd3 100644 --- a/src/siri/db/group.c +++ b/src/siri/db/group.c @@ -153,10 +153,7 @@ int siridb_group_set_name( */ void siridb__group_decref(siridb_group_t * group) { - if (!--group->ref) - { - siridb__group_free(group); - } + siridb_group_decref(group); } /* diff --git a/src/siri/db/groups.c b/src/siri/db/groups.c index 7a270b93..cb24a96d 100644 --- a/src/siri/db/groups.c +++ b/src/siri/db/groups.c @@ -46,7 +46,6 @@ #define CALC_BATCH_SIZE(sz) GROUPS_RE_BATCH_SZ /((sz / 5 ) + 1) + 1; static int GROUPS_load(siridb_t * siridb); -static void GROUPS_free(siridb_groups_t * groups); static int GROUPS_pkg(siridb_group_t * group, qp_packer_t * packer); static int GROUPS_nseries(siridb_group_t * group, void * data); static void GROUPS_loop(void * arg); @@ -82,7 +81,7 @@ int siridb_groups_init(siridb_t * siridb) !siridb->groups->ngroups) { ERR_ALLOC - GROUPS_free(siridb->groups); + siridb__groups_free(siridb->groups); siridb->groups = NULL; return -1; } @@ -94,7 +93,7 @@ int siridb_groups_init(siridb_t * siridb) SIRIDB_GROUPS_FN) < 0 || GROUPS_load(siridb)) { ERR_ALLOC - GROUPS_free(siridb->groups); + siridb__groups_free(siridb->groups); siridb->groups = NULL; return -1; } @@ -330,19 +329,6 @@ int siridb_groups_drop_group( return 0; } -void siridb_groups_incref(siridb_groups_t * groups) -{ - groups->ref++; -} - -void siridb_groups_decref(siridb_groups_t * groups) -{ - if (!--groups->ref) - { - GROUPS_free(groups); - } -} - /* * Main thread. */ @@ -366,7 +352,7 @@ static int GROUPS_nseries( return 0; } -static void GROUPS_free(siridb_groups_t * groups) +void siridb__groups_free(siridb_groups_t * groups) { size_t i; free(groups->fn); diff --git a/src/siri/db/series.c b/src/siri/db/series.c index f4f5b355..9515ba44 100644 --- a/src/siri/db/series.c +++ b/src/siri/db/series.c @@ -774,10 +774,7 @@ siridb_points_t * siridb_series_get_points( */ void siridb__series_decref(siridb_series_t * series) { - if (!--series->ref) - { - siridb__series_free(series); - } + siridb_series_decref(series); } siridb_points_t * siridb_series_get_first( diff --git a/src/siri/db/shard.c b/src/siri/db/shard.c index 3bdf141c..fc1dbd2c 100644 --- a/src/siri/db/shard.c +++ b/src/siri/db/shard.c @@ -1569,10 +1569,7 @@ int siridb_shard_optimize(siridb_shard_t * shard, siridb_t * siridb) */ void siridb__shard_decref(siridb_shard_t * shard) { - if (!--shard->ref) - { - siridb__shard_free(shard); - } + siridb_shard_decref(shard); } void siridb_shard_drop(siridb_shard_t * shard, siridb_t * siridb) diff --git a/src/siri/db/shards.c b/src/siri/db/shards.c index d399fb63..6eff0245 100644 --- a/src/siri/db/shards.c +++ b/src/siri/db/shards.c @@ -389,7 +389,7 @@ static inline int SHARDS_to_vec_cb(omap_t * omap, vec_t * v) for (;iter && (shard = iter->data_); iter = iter->next_) { vec_append(v, shard); - ++shard->ref; + siridb_shard_incref(shard); } return 0; } diff --git a/src/siri/db/tag.c b/src/siri/db/tag.c index 486b8811..d4aed6ac 100644 --- a/src/siri/db/tag.c +++ b/src/siri/db/tag.c @@ -314,10 +314,7 @@ int siridb_tag_set_name( */ void siridb__tag_decref(siridb_tag_t * tag) { - if (!--tag->ref) - { - siridb__tag_free(tag); - } + siridb_tag_decref(tag); } /* diff --git a/src/siri/db/tags.c b/src/siri/db/tags.c index 995abbce..fe4697b5 100644 --- a/src/siri/db/tags.c +++ b/src/siri/db/tags.c @@ -20,7 +20,6 @@ #include #include -static void TAGS_free(siridb_tags_t * tags); static int TAGS_load(siridb_t * siridb); static int TAGS_dropped_series( siridb_tag_t * tag, @@ -55,7 +54,7 @@ int siridb_tags_init(siridb_t * siridb) siridb->tags->tags == NULL || TAGS_load(siridb)) { - TAGS_free(siridb->tags); + siridb__tags_free(siridb->tags); siridb->tags = NULL; return -1; } @@ -63,19 +62,6 @@ int siridb_tags_init(siridb_t * siridb) return 0; } -void siridb_tags_incref(siridb_tags_t * tags) -{ - tags->ref++; -} - -void siridb_tags_decref(siridb_tags_t * tags) -{ - if (!--tags->ref) - { - TAGS_free(tags); - } -} - /* * Main thread. * @@ -429,7 +415,7 @@ static int TAGS_load(siridb_t * siridb) return rc; } -static void TAGS_free(siridb_tags_t * tags) +void siridb__tags_free(siridb_tags_t * tags) { if (tags->flags & TAGS_FLAG_REQUIRE_SAVE) { diff --git a/src/siri/net/bserver.c b/src/siri/net/bserver.c index f5b66daa..3fd9b81b 100644 --- a/src/siri/net/bserver.c +++ b/src/siri/net/bserver.c @@ -884,8 +884,7 @@ static void on_series_tags(sirinet_stream_t * client, sirinet_pkg_t * pkg) qp_obj_t qp_tag_name; /* take a reference since this task might wait for a lock */ - - ++series->ref; + siridb_series_incref(series); uv_mutex_lock(&siridb->tags->mutex);